﻿
#region Copyright & License
// --------------------------
// Copyright 2008 Daniel Gray
// --------------------------
// This file is part of Kale.
//
// Kale is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Kale is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with Kale.  If not, see <http://www.gnu.org/licenses/>.
#endregion
#region File details
// --------------------------------------------------------
// Filename          : MinifyScript.cs
// Author            : Daniel Gray
// Created           : 06/05/2008 
// --------------------------------------------------------
#endregion

using System;
using System.Collections;
using System.Data;
using System.Linq;
using System.Web;
using System.Xml.Linq;
using Kale.Core.Configuration;
using System.Web.Caching;
using System.IO;

namespace Kale.Core.Web
{
   /// <summary>
   /// Automatically minifies Javascript files.
   /// </summary>
   public class MinifyScriptHandler : IHttpHandler
   {
      private string _cachePrefix = typeof(MinifyScriptHandler).FullName + "_";

      public void ProcessRequest(HttpContext context)
      {
         
         KaleConfigurationSection config = KaleConfigurationSection.Default;

         context.Response.Expires = config.Scripting.ExpiryHours;
         context.Response.Clear();
         context.Response.ContentType = "text/javascript";

         string scriptPath = context.Request.PhysicalPath;
         string cacheKey = _cachePrefix + scriptPath;

         if (context.Cache[cacheKey] == null)
         {
            string script = string.Empty;

            if (config.Scripting.Minify)
            {
               JavascriptMinifier minifier = new JavascriptMinifier();
               script = minifier.Minify(scriptPath);
            }
            else
            {
               script = File.ReadAllText(scriptPath);
            }

            context.Cache.Add(cacheKey,
                              script,
                              new CacheDependency(context.Request.PhysicalPath),
                              config.NodeCaching.ExpirationType == CacheExpirationType.Absolute ? DateTime.Now.AddMinutes(config.NodeCaching.ExpirationMinutes) : Cache.NoAbsoluteExpiration,
                              config.NodeCaching.ExpirationType == CacheExpirationType.Sliding ? TimeSpan.FromMinutes(config.NodeCaching.ExpirationMinutes) : Cache.NoSlidingExpiration,
                              CacheItemPriority.Normal,
                              null);
         }

         context.Response.Write(context.Cache[cacheKey] as string);
         context.Response.End();
      }

      public bool IsReusable
      {
         get
         {
            return true;
         }
      }
   }
}
